package lock.redisRenewDistLock;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * 延迟队列元素包装实体类
 * 存放到延迟队列的元素，比标准的delay的实现要提前一点时间
 *
 * @Author: ShenWei
 * @Date: 2024/07/02/9:06
 */
public class ItemVO<T> implements Delayed {

    private long activeTime; // 到期时刻

    private T data; // 具体业务数据

    /**
     * 构造方法
     * @param expirationTime 过期时长 -> 需要转换为到期时间后，再稍微提前一点
     * @param data           业务数据
     */
    public ItemVO(long expirationTime, T data) {
        super();
        this.activeTime = expirationTime + System.currentTimeMillis() - 100;
        this.data = data;
    }

    public long getActiveTime() {
        return activeTime;
    }

    public T getData() {
        return data;
    }

    /**
     * 返回当前元素到激活时刻的剩余存活时长
     * @param unit the time unit
     * @return 剩余存活时长
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(this.activeTime - System.currentTimeMillis(), unit);
    }

    /**
     * 按剩余存活时长排序
     * @param o the object to be compared.
     * @return 0-相等，-1-当前元素存活时间短，1-入参元素存活时间短
     */
    @Override
    public int compareTo(Delayed o) {
        long d = (getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
        if (d == 0) {
            return 0;
        } else {
            if (d < 0) {
                return -1;
            } else {
                return 1;
            }
        }
    }
}
